// 首先，看到这么少的硬币数量和卡牌种类，应该想到状态压缩和dfs
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
// dp[i][j] 表示当前所获得的卡牌种类是i，硬币数是j的数学期望
const int N = 1 << 16, M = 5 * 16 + 1;
double f[N][M];
int n, m;
double p[16];

double dp(int state, int coin, int r)
{
    double& v = f[state][coin];
    if (v >= 0) return v;
    if (coin >= r * m) return v = 0;
    v = 0;
    for (int i = 0; i < n; ++i)
        if ((state >> i) & 1)
            v += p[i] * (dp(state, coin + 1, r) + 1);
        else
            v += p[i] * (dp(state | (1 << i), coin, r - 1) + 1);
    return v;
}

int main()
{
    memset(f, -1, sizeof f);
    cin >> n >> m;
    for (int i = 0; i < n; ++i) cin >> p[i];
    printf("%.10lf\n", dp(0, 0, n));
    return 0;
}